import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @作者 zxy
 * @时间 2023-03-30 17:01
 * @说明
 */
public class Solution {
    /**
     * 执行用时：5 ms , 在所有 Java 提交中击败了24.72%的用户
     * 内存消耗：43.4 MB, 在所有 Java 提交中击败了5.14%的用户
     * @param root
     * @return
     */
    public int[] findMode(TreeNode root) {
        if (root == null) return new int[0];
        HashMap<Integer, Integer> map = new HashMap<>();
        recordMode(root, map);
        int maxMode = Integer.MIN_VALUE;

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (maxMode < entry.getValue()) {
                maxMode = entry.getValue();
            }
        }
        List<Integer> list = new ArrayList();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (maxMode == entry.getValue()) {
                list.add(entry.getKey());
            }
        }
        int[] res = new int[list.size()];
        for (int i = 0; i < res.length; i++) {
            res[i] = list.get(i);
        }
        return res;
    }

    public void recordMode(TreeNode node, HashMap<Integer, Integer> map) {
        Integer integer = map.get(node.val);
        if (integer == null) map.put(node.val, 1);
        else map.replace(node.val, integer + 1);

        if (node.left != null) recordMode(node.left, map);
        if (node.right != null) recordMode(node.right, map);
    }
}
